<?php

namespace app\index\controller;

use think\Controller;
use think\Db;
use think\Session;

class Note extends Controller
{
    // 笔记详情
    public function index($id)
    {
        // 获取该笔记的类型
        $type = Db::name('user_note')->field('type')->find($id)['type'];
        // 获取相关笔记
        $similar = $this->getSimilar($id);
//        halt($similar);
        // 获取相应的评论
        $comment = $this->getComment($id);
//        halt($comment);
        // 获取该笔记总评论数
        $totalComment = $this->countComment($id);

//        halt($comment);
        // 模板赋值
        $this->assign([
            'comment' => $comment,
            'similar' => $similar,
            'totalComment' => $totalComment
        ]);
        // 显示不同的页面
        switch ($type) {
            case '0':
                // 文章类型笔记
                $data = $this->getTitleInfo($id);
//                halt($data);
                return view('note/title', [
                    'data' => $data
                ]);
                break;
            case '1':
                // 图片类型笔记
                $data = $this->getImageNote($id);
//                halt($data);
                return view('note/index', [
                    'data' => $data
                ]);
                break;
            case '2':
                // 视频类型笔记
                $data = $this->getVideoNote($id);

                return view('note/video', [
                    'data' => $data
                ]);
                break;
        }


    }


    // 笔记点赞
    public function praise()
    {
        // 判断用户是否登录
        if ($this->isLogin()) {
            // 如果用户已登录

            // 获取笔记id数据
            $note_id = input('post.note_id');

//            halt($this->isDo('user_praise',$note_id));
            if ($this->isDo('user_praise',$note_id)) {
                // 如果为true 则证明该用户还未对该笔记点赞
                // 要加入到用户点赞表的数据
                $praiseData = [
                    'uid' => session('data.id'),
                    'note_id' => $note_id
                ];
                $result = Db::name('user_praise')->data($praiseData)->insert();
                if ($result) {
                    // 点赞成功
                    // 获取笔记当前的点赞数并加1
                    $praiseNum = Db::name('user_note')->field('praise')->find($note_id)['praise'];
                    $addPraise = Db::name('user_note')->update([
                        'id' => $note_id,
                        'praise' => $praiseNum+1
                    ]);

                    if ($addPraise) {
                        // 添加成功
                        $data['status'] = true;
                        $data['msg'] = '点赞成功';
                        return json($data);
                    } else {
                        // 添加失败
                        $data['status'] = false;
                        $data['msg'] = '点赞失败';
                        return json($data);
                    }
                }
            } else {
                // 用户已经对该笔记点过赞

                // 如果以点赞就取消点赞
                $result = Db::name('user_praise')->where('note_id',$note_id)->where('uid',session('data.id'))->delete();
                if ($result) {
                    // 成功取消关注则对用户笔记表中的点赞数减1
                    $praiseNum = Db::name('user_note')->field('praise')->find($note_id)['praise'];
                    $delPraise = Db::name('user_note')->update([
                        'id' => $note_id,
                        'praise' => $praiseNum-1
                    ]);
                    if ($delPraise) {
                        // 成功取消关注
                        $data['status'] = true;
                        $data['msg'] = '成功取消点赞';
                        return json($data);
                    } else {
                        $data['status'] = false;
                        $data['msg'] = '取消点赞失败';
                        return json($data);
                    }
                }

            }

        } else {
            // 如果用户未登录
            $data['status'] = false;
            $data['msg'] = '您还未登录,请登陆后重试';
            return json($data);
        }

    }

    // 笔记收藏
    public function collection()
    {
        // 判断用户是否登录
        if ($this->isLogin() == true) {
            // 如果用户已登录
            // 获取笔记id数据
            $note_id = input('post.note_id');
            // 获取post数据
            $post = input('post.');
            if ($this->isDo('user_collection',$note_id)) {
                // 如果为true 则证明该用户还未对该笔记收藏
                // 要加入到用户收藏表的数据
                $collectionData = [
                    'uid' => session('data.id'),
                    'note_id' => $note_id
                ];
                $result = Db::name('user_collection')->data($collectionData)->insert();
                if ($result) {
                    // 收藏成功
                    // 获取笔记当前的收藏数并加1
                    $collectionNum = Db::name('user_note')->field('collection')->find($note_id)['collection'];
                    $addCollection = Db::name('user_note')->update([
                        'id' => $note_id,
                        'collection' => $collectionNum+1
                    ]);

                    if ($addCollection) {
                        // 添加成功
                        $data['status'] = true;
                        $data['msg'] = '收藏成功';
                        return json($data);
                    } else {
                        // 添加失败
                        $data['status'] = false;
                        $data['msg'] = '收藏失败';
                        return json($data);
                    }
                }
            } else {
                // 用户已经对该笔记收藏

                // 如果以收藏就取消收藏
                $result = Db::name('user_collection')->where('note_id',$note_id)->where('uid',session('data.id'))->delete();
                if ($result) {
                    // 成功取消收藏则对用户笔记表中的收藏数减1
                    $collectionNum = Db::name('user_note')->field('collection')->find($note_id)['collection'];
                    $delCollection = Db::name('user_note')->update([
                        'id' => $note_id,
                        'collection' => $collectionNum-1
                    ]);
                    if ($delCollection) {
                        // 成功取消关注
                        $data['status'] = true;
                        $data['msg'] = '成功取消收藏';
                        return json($data);
                    } else {
                        $data['status'] = false;
                        $data['msg'] = '取消点赞收藏';
                        return json($data);
                    }
                }

            }
        } else {
            // 如果用户未登录
            $data['status'] = false;
            $data['msg'] = '您还未登录,请登陆后重试';
            return json($data);
        }
    }

    // 查询笔记详情(文章类型)
    private function getTitleInfo($id)
    {
        // 获取该笔记详情
        $data = Db::field('n.id,n.title,n.thumb,n.content,n.praise,n.create_at,n.collection,u.nickname,u.signature,u.fans_num,u.collection_num,u.note_num,u.image,u.uid')
            ->table(['2B_user_note' => 'n', '2B_user_info' => 'u'])
            ->where('n.id', $id)
            ->where('n.uid = u.uid')
            ->find();

        return $data;
    }

    // 查询笔记详情(图片类型)
    private function getImageNote($id)
    {
        // 获取该笔记详情
        $data = Db::field('n.id,n.title,n.thumb,n.content,n.praise,n.create_at,n.collection,u.nickname,u.signature,u.fans_num,u.collection_num,u.note_num,u.image,u.uid')
            ->table(['2B_user_note' => 'n', '2B_user_info' => 'u'])
            ->where('n.id', $id)
            ->where('n.uid = u.uid')
            ->find();
        // 获取配图
        $img = Db::name('note_image')->field('group_concat(img) img')->where('note_id', $id)->group('note_id')->find()['img'];
        $data['img'] = explode(',', $img);
        return $data;
    }

    // 查询笔记详情(视频类型)
    private function getVideoNote($id)
    {
        // 获取该笔记详情
        $data = Db::field('n.id,n.title,n.thumb,n.content,n.praise,n.create_at,n.collection,u.nickname,u.signature,u.fans_num,u.collection_num,u.note_num,u.image,v.video,u.uid')
            ->table(['2B_user_note' => 'n', '2B_user_info' => 'u', '2B_note_video' => 'v'])
            ->where('n.id', $id)
            ->where('n.uid = u.uid')
            ->where('v.note_id', $id)
            ->find();

        return $data;
    }

    // 相关笔记推荐
    private function getSimilar($id)
    {
//        SELECT * FROM 2B_user_note WHERE tags_id = 13 ORDER BY rand() LIMIT 2
        // 当前笔记的类型
        $type = Db::name('user_note')->field('tags_id')->find($id)['tags_id'];
        $data = Db::name('user_note')->field('id,title,thumb')->where('tags_id', $type)->orderRaw('rand()')->limit(5)->select();
        return $data;
    }


    // 获取相应笔记的评论
    private function getComment($id)
    {
        // 有回复的笔记
        $data = Db::field('c.id,c.comment,c.comment_at,group_concat(r.text) response,u.uid,u.nickname,u.image,s.voucher,group_concat(r.uname) uname')
            ->table(['2B_note_comment' => 'c', '2B_comment_response' => 'r', '2B_user_info' => 'u', '2B_user' => 's'])
            ->where('c.note_id', $id)
            ->where('c.uid=u.uid')
            ->where('u.uid=s.id')
            ->where('r.comment_id=c.id')
            ->group('c.comment,c.comment_at,u.uid,u.nickname,u.image,s.voucher,c.id')
            ->select();





        // 如果没有回复的笔记
        if (empty($data)) {
            $data = Db::field('c.id,c.comment,c.comment_at,u.uid,u.nickname,u.image,s.voucher')
                ->table(['2B_note_comment' => 'c', '2B_user_info' => 'u', '2B_user' => 's'])
                ->where('c.note_id', $id)
                ->where('c.uid=u.uid')
                ->where('u.uid=s.id')
                ->select();
        } else {
            $list = Db::field('c.id,c.comment,c.comment_at,u.uid,u.nickname,u.image,s.voucher')
                ->table(['2B_note_comment' => 'c', '2B_user_info' => 'u', '2B_user' => 's'])
                ->where('c.note_id', $id)
                ->where('c.uid=u.uid')
                ->where('u.uid=s.id')
                ->select();

            foreach ($data as $v) {
                $ids[] = $v['id'];
            }
//        dump($ids);
            foreach ($list as $val) {
                if (!in_array($val['id'],$ids)) {
//                    dump($val['id']);
                    $data[] = $val;
                }
            }
        }
        return $data;
    }



    // 计算笔记评论数
    private function countComment($id)
    {
        // 统计笔记评论的数量
        $comment_num = Db::name('note_comment')->where('note_id', $id)->count();
        // 统计笔记回复的数量
        $response_num = Db::table(['2B_note_comment' => 'c', '2B_comment_response' => 'r'])
            ->where('c.note_id', $id)
            ->where('r.comment_id=c.id')
            ->count();

        return $response_num + $comment_num;
    }


    // 判断用户是否登录,是否可以点赞和收藏(前台用户)
    private function isLogin()
    {
        // 获取session
        $data = session('data');
        if (empty($data)) {
            return false;
        } else {
            return true;
        }
    }

    // 获取用户点赞表和用户收藏表对当前笔记的用户是否存在
    private function isDo($table,$id)
    {
        // 当前用户是否对该笔记点赞或收藏
        $uid = Db::name($table)->field('uid')->where('note_id',$id)->find()['uid'];
        // 当前用户的id
        $id = session('data.id');
        // 判断是否收藏
        if (!empty($uid) && $uid == $id) {
            // 已经点赞或收藏
            return false;
        } else {
            // 还未点赞和收藏
            return true;
        }
    }

    // 添加笔记
    public function create()
    {
        $session = Session::has('data');
        if (!$session){
            return $this->error('对不起,您还没有登录,请先去登录!!!!', url('index/Index/login'));
            }
        // 获取所有标签
        $type = db('note_type')->field('id,tag_name')->select();
//        var_dump($type);

        return view('note/create',['data' => $type]);
    }


    // 文本添加编辑处理
    public function TextCreate()
    {

        // 获取上传的信息
        $note = input('post.');
        $note['title'] = $this->UnicodeEncode($note['title']);
        $note['content'] = $this->UnicodeEncode($note['content']);
        // 获取上传的文件
        $file = request()->file('image');

        // 调用方法
        $upImg = $this->uploadImg($note,$file);

        if ($upImg){
            $this->success('添加成功!', url('index/Index/index'));
        }else{
            $this->error('对不起,添加失败了');
        }

    }


    // 图片添加编辑处理
    public function ImgsCreate()
    {
        // 获取上传的信息
        $note = input('post.');
        $note['title'] = $this->UnicodeEncode($note['title']);
        $note['content'] = $this->UnicodeEncode($note['content']);
        // 获取上传的文件
        $file = request()->file('image');
        // 获取上传的附图
        $imgs = request()->file('imgs');

        if (empty($note) || empty($file) || empty($imgs)) {
            $this->error('对不起,添加失败了');
            return;
        }

        $mullname = [];
        for ($i=0 ; $i < count($imgs) ; $i++){
            $mullname[] = $imgs[$i]->move(ROOT_PATH . 'public' . DS . 'static/uploads/img')->getSaveName();
        }

        // 调用方法
        $upImg = $this->uploadImg($note,$file,$mullname);

        if ($upImg ){
            $this->success('添加成功!', url('index/Index/index'));
        }else{
            $this->error('对不起,添加失败了');
        }

    }

    // 视频添加编辑处理
    public function VideoCreate()
    {
        // 获取上传的信息
        $note = input('post.');
        $note['title'] = $this->UnicodeEncode($note['title']);
        $note['content'] = $this->UnicodeEncode($note['content']);
        // 获取上传的文件
        $file = request()->file('image');
        // 获取上传的视频
        $video = request()->file('video');
        if (empty($note) || empty($file) || empty($video)) {
            $this->error('对不起,添加失败了');
            return;
        }
       // dump($note);
       // dump($file);
       // halt($video);
        //将视频
        $videos = $video->move(ROOT_PATH . 'public' . DS . 'static/uploads/video')->getSaveName();

        // 调用方法
        $upImg = $this->uploadImg($note,$file,null,$videos);

        if ($upImg){
            $this->success('添加成功!', url('index/Index/index'));
        }else{
            $this->error('对不起,添加失败了');
        }

    }

    //删除笔记
    public function delCreate()
    {
        // 获取要删除笔记的id
        $createId = input('post.create_id');
        // 获取类型,用户id,封面图
        $create = db('user_note')->field('type,uid,thumb')->where('id','eq',$createId)->find();
//        return false;
        // 删除评论
        db('note_comment')->where('note_id',$createId)->delete();
//        dump($create['type']);

        if ($create['type'] == 1) {
            // 获取图片路径
            $image = db('note_image')->field('img')->where('note_id', 'eq', $createId)->select();
            // 删除图片
            for ($i = 0; $i < count($image); $i++) {
                $imgs = $image[$i]['img'];
                unlink(ROOT_PATH . 'public' . DS . "static/uploads/img/$imgs");
            }
            // 删除数据
            db('note_image')->where('note_id', 'eq', $createId)->delete();
        }

        if ($create['type'] == 2) {
            // 获取视频路径
            $video = db('note_video')->field('video')->where('note_id','eq',$createId)->find()['video'];
//            halt($video); 
            // 删除图片
            unlink( ROOT_PATH . 'public' . DS . "static/uploads/video/$video");
            // 删除数据
            db('note_image')->where('note_id','eq',$createId)->delete();
        }

        // 删除封面图
        $path = $create['thumb'];
        unlink( ROOT_PATH . 'public' . DS . "static/uploads/img/$path");
        // 删除笔记数据
        $createRow = db('user_note')->where('id','eq',$createId)->delete();
        $id = Session::get('data.id');
        db('user_info')->where('uid',$id)->setDec('note_num');


        if ($createRow > 0){
            return true;
        }else{
            return false;
        }

    }


    // 处理图片
    protected function uploadImg($note,$file,$imgs = null,$videos = null)
    {
        // 获取用户信息
        $user = Session::get('data');

        // 移动到框架应用根目录/public/uploads/ 目录下
        if($file){
            $info = $file->move(ROOT_PATH . 'public' . DS . 'static/uploads/img');
            if($info){
                // 成功上传后 获取上传信息
//                echo $info->getExtension(); // 输出 jpg
//                echo $info->getFilename(); // 输出 42a79759f284b767dfcb2a0197904287.jpg
                $path = str_replace('\\','/',$info->getSaveName()); // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg


                // 存储笔记信息
                $data = [
                    'title'   => $note['title'],
                    'thumb'   => $path,
                    'type'    => $note['type'],
                    'tags_id' => $note['interesting'],
                    'content' => $note['content'],
                    'uid'     => $user['id'],
                ];
//                halt($data);
                $note_id = db('user_note')->insertGetId($data);

                if ($note_id > 0){
                    // 添加附图
                    if (!empty($imgs)){
                        foreach($imgs as $v) {
                            Db::name('note_image')->insert(['img' => $v,'note_id' => $note_id ]);
                        }
                    }
                    // 添加视频
                    if (!empty($videos)){
                        Db::name('note_video')->insert(['video' => $videos,'note_id' => $note_id ]);
                    }

                    // 笔记数量加1
                    db('user_info')->where('uid',$user['id'])->setInc('note_num', 1);
                    return true;
                }else{
                    //删除图片....
                    unlink( ROOT_PATH . 'public' . DS . "static/uploads/img/$path");
                    
                }

            }else{
                // 上传失败获取错误信息
                echo $file->getError();
                
            }
        }
    }

    // unicode码转换
    function UnicodeEncode($str){
    
        preg_match_all('/./u',$str,$matches);
 
        $unicodeStr = "";
        foreach($matches[0] as $m){
        //拼接
            $unicodeStr .= "&#".base_convert(bin2hex(iconv('UTF-8',"UCS-4",$m)),16,10);
        }
        return $unicodeStr;
    }

}
